package com.example.cybz.acl.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.cybz.acl.service.RoleService;
import com.example.cybz.common.result.Result;
import com.example.cybz.model.acl.Role;
import com.example.cybz.vo.acl.RoleQueryVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Log4j2
@Api(tags = "角色接口")
@RestController
@RequestMapping("/admin/acl/role")
@RequiredArgsConstructor
public class RoleController {

    private final RoleService roleService;

    /**
     * 角色条件分页查询
     *
     * @param current     当前页码
     * @param limit       每页显示记录数
     * @param roleQueryVo 查询条件封装对象
     * @return Result<Object> 分页结果封装对象
     */
    @ApiOperation("角色条件分页查询")
    @GetMapping("/{current}/{limit}")
    public Result<Object> list(@PathVariable Long current, @PathVariable Long limit, RoleQueryVo roleQueryVo) {
        log.info("正在获取角色");
        // 1. 创建分页对象
        Page<Role> rolePage = new Page<>(current, limit);
        // 2. 调用service方法实现条件分页查询，返回分页对象
        Page<Role> pageModel = roleService.selectRolePage(roleQueryVo, rolePage);
        log.info("角色数据：{}", pageModel.toString());
        return Result.ok(pageModel);
    }

    // 根据角色id进行查询
    /**
     * 根据角色id进行查询
     *
     * @param id 角色唯一标识
     * @return Result<Role> 查询结果封装对象
     */
    @ApiOperation(value = "根据角色id进行查询")
    @GetMapping("/get/{id}")
    public Result<Role> get(@PathVariable Long id) {
        log.info("正在查询角色id：{}", id);
        // 查询角色
        Role byId = roleService.getById(id);
        log.info("角色数据：{}", byId.toString());
        return Result.ok(byId);
    }

    /**
     * 添加角色
     *
     * @param role 待添加的角色对象
     * @return Result<Void> 操作结果封装对象
     */
    @ApiOperation(value = "添加角色")
    @PostMapping("/save")
    public Result<Void> save(@RequestBody Role role) {
        log.info("正在添加角色：{}", role.toString());
        // 新增角色
        boolean save = roleService.save(role);
        if (save) {
            return Result.ok();
        }
        log.info("添加角色信息：{}", role.toString());
        return Result.fail();
    }

    /**
     * 修改角色
     *
     * @param role 待修改的角色对象
     * @return Result<Object> 操作结果封装对象
     */
    @ApiOperation(value = "修改角色")
    @PutMapping("update")
    public Result<Object> update(@RequestBody Role role) {
        log.info("正在修改角色：{}", role.toString());
        // 修改角色
        boolean save = roleService.updateById(role);
        log.info("修改角色信息：{}", role.toString());
        // 三元表达式更精简
         return save ? Result.ok() : Result.fail();
    }

    /**
     * 删除角色
     *
     * @param id 角色唯一标识
     * @return Result<Object> 操作结果封装对象
     */
    @ApiOperation(value = "删除角色")
    @DeleteMapping("/remove/{id}")
    public Result<Object> remove(@PathVariable Long id) {
        // 根据id删除角色
        boolean remove = roleService.removeById(id);
        return remove ? Result.ok() : Result.fail();
    }

    /**
     * 批量删除角色
     *
     * @param idList 待删除角色的ID集合
     * @return Result<Object> 操作结果封装对象
     */
    @ApiOperation(value = "批量删除")
    @DeleteMapping("batchRemove")
    public Result<Object> batchRemove(@RequestBody List<Long> idList){
        boolean removeByIds = roleService.removeByIds(idList);
        return removeByIds ? Result.ok() : Result.fail();
    }
}
